/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.isd.pool.web;

import com.isd.global.util.JsfUtil;
import com.isd.global.util.UtilFechas;
import com.isd.pool.modelo.EstadoReserva;
import com.isd.pool.modelo.ReservasPool;
import com.isd.pool.rn.PoolRN;
import com.isd.seguridad.web.UsuarioSessionBean;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

/**
 * Bean para consultas de pooles por usuario
 * @author ctrosch
 */
@ManagedBean
@ViewScoped
public class PoolClienteBean implements Serializable{

    @EJB private PoolRN poolRN;
    
    private List<ReservasPool> reservasConfirmadas;
    private List<ReservasPool> reservasPedidoGenerado;
    private List<ReservasPool> reservasNoCerradas;
    private List<ReservasPool> reservasAnuladas;
    
    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean usuarioSession;

    @ManagedProperty(value = "#{poolAplicacionBean}")
    private PoolAplicacionBean poolAplicacionBean;

    /** Creates a new instance of PoolBean */
    public PoolClienteBean() {

    }

    @PostConstruct
    public void init() {
        
        try {

            if(!usuarioSession.isEstaRegistrado()){
                JsfUtil.addErrorMessage("No existe cliente registrado");                
            }

            if(usuarioSession.getUsuario().getCliente()==null){
                
                JsfUtil.addErrorMessage("No existe cliente seleccionado");
                
            }else{

                cargarDatos();
            }

            if(reservasConfirmadas.isEmpty()
                    && reservasNoCerradas.isEmpty()
                    && reservasPedidoGenerado.isEmpty()
                    && reservasAnuladas.isEmpty()){

                JsfUtil.addInfoMessage("No se encontraron actividades relacionadas con ventas especiales.");
            }

        } catch (Exception ex){
            
            JsfUtil.addErrorMessage("No es posible visualizar los datos solicitados");
        }
        
    }


    public void cargarDatos(){

        reservasConfirmadas = poolRN.getReservasPorCliente(usuarioSession.getUsuario().getCliente(), EstadoReserva.Confirmado);
        reservasPedidoGenerado = poolRN.getReservasPorCliente(usuarioSession.getUsuario().getCliente(),EstadoReserva.PedidoGenerado);
        reservasNoCerradas = poolRN.getReservasPorCliente(usuarioSession.getUsuario().getCliente(),EstadoReserva.PoolNoCerrado);
        reservasAnuladas = poolRN.getReservasPorCliente(usuarioSession.getUsuario().getCliente(),EstadoReserva.AnuladoCliente);
    }

    public void anularReserva(ReservasPool r){

        try {
            if(!r.getPool().isActiva()){
                JsfUtil.addWarningMessage("No es posible anular su reserva, en la venta especial, no se encuentra activa");
                return;
            }
            

            if(!r.getPool().getTipo().getPermiteAnulacion().equals("S")){
                JsfUtil.addWarningMessage("No es posible anular su reserva, la venta especial no admite anulaciones");
                return;
            }

            if(UtilFechas.getDiferencia(new Date(), r.getPool().getDisponibleHasta(), 3) < r.getPool().getTiempoMinimoAnulacion()){

                JsfUtil.addWarningMessage("No es posible anular su reserva, la venta especial está pronto a finalizar");
                return;
            }

            r.setEstado(EstadoReserva.AnuladoCliente);
            poolRN.guardarReservar(r);
            poolAplicacionBean.guardarDatosPool(r.getPool());
            
            cargarDatos();
            JsfUtil.addInfoMessage("Su reserva ha sido anulada");
            
        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "anularReserva", e);          
            JsfUtil.addErrorMessage("No es posible anular su reserva");
        }
    }

    //-----------------------------------

    public List<ReservasPool> getReservasAnuladas() {
        return reservasAnuladas;
    }

    public void setReservasAnuladas(List<ReservasPool> reservasAnuladas) {
        this.reservasAnuladas = reservasAnuladas;
    }

    public List<ReservasPool> getReservasConfirmadas() {
        return reservasConfirmadas;
    }

    public void setReservasConfirmadas(List<ReservasPool> reservasConfirmadas) {
        this.reservasConfirmadas = reservasConfirmadas;
    }

    public List<ReservasPool> getReservasPedidoGenerado() {
        return reservasPedidoGenerado;
    }

    public void setReservasPedidoGenerado(List<ReservasPool> reservasPedidoGenerado) {
        this.reservasPedidoGenerado = reservasPedidoGenerado;
    }

    public UsuarioSessionBean getUsuarioSession() {
        return usuarioSession;
    }

    public void setUsuarioSession(UsuarioSessionBean usuarioSession) {
        this.usuarioSession = usuarioSession;
    }

    public PoolAplicacionBean getPoolAplicacionBean() {
        return poolAplicacionBean;
    }

    public void setPoolAplicacionBean(PoolAplicacionBean poolAplicacionBean) {
        this.poolAplicacionBean = poolAplicacionBean;
    }

    public List<ReservasPool> getReservasNoCerradas() {
        return reservasNoCerradas;
    }

    public void setReservasNoCerradas(List<ReservasPool> reservasNoCerradas) {
        this.reservasNoCerradas = reservasNoCerradas;
    }
}
